import asyncio
import time


# 多协程-协程的异步任务返回值

# 吃饭任务
async def eat(name: str):
    for i in range(6):
        print(f'{name}正在吃东西...')
        await asyncio.sleep(0)
    return f'{name}正在吃东西...'


# 做作业任务
async def work(name: str):
    for i in range(6):
        print(f'{name}正在学习...')
        await asyncio.sleep(0)
    return f'{name}正在学习...'


# 定义一个异步函数入口
async def main():
    # 方式一：函数返回值，    # 仅仅得到函数的返回值
    # result = await asyncio.gather(eat('张三'), work('张三'))
    # print(result) # ['张三正在吃东西...', '张三正在学习...']

    # # 方式二：# 其他协程的入口 异步函数（协程）执行，多个协程交替执行。
    # task1 = asyncio.create_task(eat('张三'), name='task1')
    # task2 = asyncio.create_task(work('张三'), name='task2')
    # result = await asyncio.gather(task1, task2)
    # print(result) # ['张三正在吃东西...', '张三正在学习...']

    # 方式三：更详细的返回
    task1 = asyncio.create_task(eat('张三'), name='task1')
    task2 = asyncio.create_task(work('张三'), name='task2')
    task1.cancel()
    # 当第一个协程强制终止，会影响第二个协程,只返回简单结果 return_exceptions 参数。
    # result = await asyncio.gather(task1, task2, return_exceptions=True)
    #
    result = await asyncio.wait([task1, task2])
    print(result)


if __name__ == '__main__':
    start = time.time()
    # 如下调用异步函数（协程）是其实是同步的
    # asyncio.run(eat())
    # asyncio.run(work())

    # 异步函数统一入口
    asyncio.run(main())
    print(f'耗时为:{time.time() - start}')
